<?php
/**
 *
 * @package Legacy
 * @version $Id: LegacySearchService.class.php 208 2010-07-05 11:55:23Z mikhail.miguel $
 * @copyright Copyright 2005-2007 XOOPS Cube Project  <http://xoopscube.sourceforge.net/> 
 * @license http://xoopscube.sourceforge.net/license/GPL_V2.txt GNU GENERAL PUBLIC LICENSE Version 2
 *
 */

if (!defined('XOOPS_ROOT_PATH')) exit();

class Legacy_SearchModule extends XCube_Object
{
    function getPropertyDefinition()
    {
        $ret = array(
            S_PUBLIC_VAR("int mid"),
            S_PUBLIC_VAR("string name")
        );
        
        return $ret;
    }
}

class Legacy_SearchModuleArray extends XCube_ObjectArray
{
    function getClassName()
    {
        return "Legacy_SearchModule";
    }
}


class Legacy_SearchItem extends XCube_Object
{
    function getPropertyDefinition()
    {
        $ret = array(
            S_PUBLIC_VAR("string image"),
            S_PUBLIC_VAR("string link"),
            S_PUBLIC_VAR("string title"),
            S_PUBLIC_VAR("int uid"),
            S_PUBLIC_VAR("int time")
        );
        
        return $ret;
    }
}

class Legacy_SearchItemArray extends XCube_ObjectArray
{
    function getClassName()
    {
        return "Legacy_SearchItem";
    }
}

class Legacy_SearchModuleResult extends XCube_Object
{
    function getPropertyDefinition()
    {
        $ret = array(
            S_PUBLIC_VAR("int mid"),
            S_PUBLIC_VAR("string name"),
            S_PUBLIC_VAR("int has_more"),
            S_PUBLIC_VAR("Legacy_SearchItemArray results"),
            S_PUBLIC_VAR("string showall_link")
        );
        
        return $ret;
    }
}

class Legacy_SearchModuleResultArray extends XCube_ObjectArray
{
    function getClassName()
    {
        return "Legacy_SearchModuleResult";
    }
}

class Legacy_ArrayOfInt extends XCube_ObjectArray
{
    function getClassName()
    {
        return "int";
    }
}

class Legacy_ArrayOfString extends XCube_ObjectArray
{
    function getClassName()
    {
        return "string";
    }
}

/**
 * Sample class
 */
class Legacy_SearchService extends XCube_Service
{
    var $mServiceName = "Legacy_SearchService";
    var $mNameSpace = "Legacy";
    var $mClassName = "Legacy_SearchService";
    
    function prepare()
    {
        $this->addType('Legacy_SearchModule');
        $this->addType('Legacy_SearchModuleArray');
        $this->addType('Legacy_SearchItem');
        $this->addType('Legacy_SearchItemArray');
        $this->addType('Legacy_SearchModuleResult');
        $this->addType('Legacy_SearchModuleResultArray');
        $this->addType('Legacy_ArrayOfInt');
        $this->addType('Legacy_ArrayOfString');
    
        $this->addFunction(S_PUBLIC_FUNC('Legacy_SearchItemArray searchItems(int mid, Legacy_ArrayOfString queries, string andor, int maxhit, int start)'));
        $this->addFunction(S_PUBLIC_FUNC('Legacy_SearchItemArray searchItemsOfUser(int mid, int uid, int maxhit, int start)'));
        $this->addFunction(S_PUBLIC_FUNC('Legacy_SearchModuleArray getActiveModules()'));
    }
    
    function getActiveModules()
    {
        //
        // At first, get active module IDs.
        //
        $handler =& xoops_gethandler('module');
        
        $criteria = new CriteriaCompo();
        $criteria->add(new Criteria('isactive', 1));
        $criteria->add(new Criteria('hassearch', 1));
        $moduleArr =& $handler->getObjects($criteria);


        $handler =& xoops_gethandler('groupperm');
        $groupArr = Legacy_SearchUtils::getUserGroups();

        $ret = array();
        foreach ($moduleArr as $module) {
            if ($handler->checkRight('module_read', $module->get('mid'), $groupArr)) {
                $ret[] = array(
                    'mid' => $module->get('mid'),
                    'name' => $module->get('name')
                );
            }
        }
        
        return $ret;
    }
    
    function searchItems()
    {
        //
        // TODO Need validation
        //
        $root =& XCube_Root::getSingleton();
        $request =& $root->mContext->mRequest;
        
        $mid = intval($request->getRequest('mid'));
        $queries = $request->getRequest('queries');
        $andor = $request->getRequest('andor');
        $maxhit = intval($request->getRequest('maxhit'));
        $start = intval($request->getRequest('start'));
        
        $ret = $this->_searchItems($mid, $queries, $andor, $maxhit, $start, 0);
        
        return $ret;
    }
    
    function searchItemsOfUser()
    {
        //
        // TODO Need validation
        //
        $root =& XCube_Root::getSingleton();
        $request =& $root->mContext->mRequest;
        
        $mid = intval($request->getRequest('mid'));
        $maxhit = intval($request->getRequest('maxhit'));
        $start = intval($request->getRequest('start'));
        $uid = intval($request->getRequest('uid'));
        
        $ret = $this->_searchItems($mid, null, 'and', $maxhit, $start, $uid);
        
        return $ret;
    }
    
    /**
     * @access private
     */
    function _searchItems($mid, $queries, $andor, $max_hit, $start, $uid)
    {
        $ret = array();

        $modleArr = $this->getActiveModules();
        
        $flag = false;
        foreach ($modleArr as $module) {
            if ($mid == $module['mid']) {
                $flag = true;
                break;
            }
        }
        
        if (!$flag) {
            return $ret;
        }
        
        $root =& XCube_Root::getSingleton();
        $timezone = $root->mContext->getXoopsConfig('server_TZ') * 3600;

        $handler =& xoops_gethandler('module');
        $xoopsModule =& $handler->get($mid);
        if (!is_object($xoopsModule)) {
            return $ret;
        }
        
        if (!$xoopsModule->get('isactive') || !$xoopsModule->get('hassearch')) {
            return $ret;
        }

        $module =& Legacy_Utils::createModule($xoopsModule);
        $results = $module->doLegacyGlobalSearch($queries, $andor, $max_hit, $start, $uid);
                
        if (is_array($results) && count($results) > 0) {
            foreach (array_keys($results) as $key) {
                //
                // TODO If this service will come to web service, we should
                // change format from unixtime to string by timeoffset.
                //
                if ($results[$key]['time'] != 0) {
                    $results[$key]['time'] = $results[$key]['time'] - $timezone;
                }
            }
        }
        
        return $results;
    }
}

class Legacy_SearchUtils
{
    function getUserGroups()
    {
        $root =& XCube_Root::getSingleton();
        $user =& $root->mController->mRoot->mContext->mXoopsUser;
        $groups = array();
        
        if (!is_object($user)) {
            $groups = XOOPS_GROUP_ANONYMOUS;
        }
        else {
            $groups = $user->getGroups();
        }
        
        return $groups;
    }
}

?>
